package crawler;

import java.util.ArrayList;
import java.util.HashMap;

/**
 *
 * Crawler является главным модулем приложения и осуществляет управление другими модулями проложения.
 * Графический интерфейс выполняется в пределах главного потока, создаваемого в данном классе
 * @author Павельев Антон, Созинов Кирилл
 */
public class Crawler {
    
    /** Объект пользовательского интерфейса **/
    public static UserInterface ui;
    /** Список распарсенных веб-страниц **/
    public static ArrayList<Page> pages;
    
    //Далее идут поля относящиеся к анализу результатов:
    public class Header{
        public String text;
        public int level;
        public int count;

        public Header(String text, int level) {
            this.text = text;
            this.level = level;
            count=1;
        }
    }
    /**Массив с заголовками и их частотой**/
    public HashMap<String,Header> headers;
    /**Индекс последнего учтенного заголовка из списка pages**/
    private int lastIncludedHeaderIndex=-1;
    
    
    public Crawler(){
        System.out.println("Конструктор Crawler запустился в потоке: "+Thread.currentThread().getName());
        pages = new ArrayList<Page>();
        headers = new HashMap<String,Header>();
        ui = new UserInterface(this);
        ui.setVisible(true);
    }
    
    public void start(String baseURL){        
        Downloader dl = new Downloader(baseURL);
        Downloader dl2 = new Downloader();
        Analyzer an = new Analyzer();
        dl.getThread().start();
        dl2.getThread().start();
        an.getThread().start();
        new Thread(new Tthr(dl)).start();
    }
    
    public static void main(String[] args) {
        Crawler crawler = new Crawler();
        crawler.ui.setLocation(100, 100);
        System.out.println("Crawler запустился в потоке: "+Thread.currentThread().getName());
    }
    
    /**
     * Пересчитывает данные о заголовках, учитывая недавно обработанные страницы
     */
    public void recalculateHeaders(){
        for (int i = lastIncludedHeaderIndex+1; i < pages.size(); i++) {
            String st = pages.get(i).firstH1;
            if (!headers.containsKey(st)) {
                headers.put(pages.get(i).firstH1,new Header(pages.get(i).firstH1,pages.get(i).distance));
            } else {
                Header hdr = headers.get(st);
                hdr.count++;
                headers.put(pages.get(i).firstH1, hdr);
            }
        }
        lastIncludedHeaderIndex=pages.size()-1;
    }
    
}
